#include <bits/stdc++.h>
#define int long long 
using namespace std;


//const int maxn = 2005;

// 题目可以转化为一个背包问题
// 即 总共需要拿走 n 个物品
// 花费 ci 可以拿走 ti + 1  (因为需要包括自身)个物品
// 目的需要使得 最终的花费最少
// 所以可以转化为一个背包, 大小为 x (x是 >=n) 的, 因为最后可能是一个所需处理时间很长的一个物品
// 那么最终实际可以拿到的物品的个数是 >= n 的
// 那么这个最大值是多少呢 ?
// 我们想想一下这个最大值的情况即可
// 最大情况肯定是, 只剩这一个物品没有被拿走, 并且这个物品所需时间是最长的
// 那么最终实际可以拿走的物品个数是 n + ti, 但是我们之前对 ti + 1 了, 所以 要减回去


//int n;
//int dp[maxn][2*maxn]; 
//int t[maxn], c[maxn];

//void solve(){
//	cin >> n;
//	int maxx = 0;
//	for (int i=1;i<=n;i++) {
//		cin >> t[i] >> c[i];
//		t[i]++;
//		maxx = max(maxx, t[i]);
//	}
//	
//	int m = n+maxx-1;
//	
//	for (int i=1;i<=m;i++) {
//		dp[0][i] = 1e18;
//	}
//	
//	int ans = 1e18;
//	
//	for (int i=1;i<=n;i++) {
//		for (int j=1;j<=m;j++) {
//			// 不选择
//			dp[i][j] = dp[i-1][j];
//			// 选择
//			if (j >= t[i]) {
//				dp[i][j] = min(dp[i][j], dp[i-1][j-t[i]] + c[i]);
//			}
//		}
//	}
//	
//	for (int j=n;j<=m;j++) {
//		ans = min(dp[n][j], ans);
//	}
//	cout << ans << '\n';
//}

// 使用一维滚动数组
const int maxn  = 2e3 + 5;
int dp[maxn];
int n;
int t[maxn], c[maxn];

void solve(){
	cin >> n;
	int maxx = 0;
	for (int i=1;i<=n;i++) {
		cin >> t[i] >> c[i];
		t[i]++;
		maxx = max(maxx, t[i]);
	}
	
	int m = n+maxx-1;
	
	for (int i=1;i<=m;i++) {
		dp[i] = 1e18;
	}
	
	int ans = 1e18;
	
	
	// 因为是 一维数组, 所以需要倒着来
	for (int i=1;i<=n;i++) {
		for (int j=m;j>=1;j--) {
			if (j >= t[i]) {
				dp[j] = min(dp[j], dp[j-t[i]] + c[i]);
			}
		}
	}
	
	for (int j=n;j<=m;j++) {
		ans = min(dp[j], ans);
	}
	cout << ans << '\n';
}




signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
